
int main()
{
    const int ci = 1024;
    const int &r0 = ci;     // 正确：引用及其对应的对象都是常量

    // r0 = 42;             // 错误：r0 是对常量的引用
    // int &ri2 = ci;       // 错误：试图让一个非常量引用指向一个常量对象

    int i = 42;
    const int &r1 = i;      // 允许将 const int& 绑定到一个普通 int 对象上
    const int &r2 = 42;     // 正确：r1 是一个常量引用
    const int &r3 = r1 * 2; // 正确：r3 是一个常量引用
    // int &r4 = r1 * 2;    // 错误：r4 是一个普通的非常量引用

    double dval = 3.14;
    const int &ri = dval;
    // 编译器把上述代码变成了如下形式：
    // const int temp = dval;  // 由双精度浮点数生成一个临时的整型常量
    // const int &ri = temp;   // 让 ri 绑定这个临时量

    int &r4 = i;            // 引用 r4 绑定对象 i
    const int &r5 = i;      // r5 也绑定对象 i，但是不允许通过 r5 修改 i 的值
    r4 = 0;                 // r4 并非常量，i 的值修改为 0
    // r5 = 0;              // 错误：r5 是一个常量引用
}